Philosophy Data Story Liang Hu 01/23/2022
when communism philosophers meet capitalism philosophers
Introduction:
Communism and capitalism are two different economic and political
ideologies that have had a significant impact on the development of
modern society. Both ideologies have their roots in philosophy, and they
have been the subject of much debate and discussion throughout
history.
Communism, as a political and economic system, is based on the idea
that all individuals should have equal access to the means of
production, and that the state should control and own these means. This
system is intended to eliminate class distinctions and create a society
where everyone has equal opportunity and access to resources. The
philosopher Karl Marx is considered the father of communism, and his
ideas have been influential in the development of communist societies
throughout the world.
Capitalism, on the other hand, is an economic system in which private
individuals and businesses own the means of production, and the economy
is driven by the profit motive. The state plays a limited role in the
economy, and individuals are free to own property, start businesses, and
compete in the market. The philosopher Adam Smith is considered the
father of capitalism, and his ideas about laissez-faire economics have
been influential in the development of capitalist societies throughout
the world.
This report is a guidebook with selected Q&A aims at finding out
the personality of representative capitalism philosopher and
representative communism philosophers. Also, investigating what are the
potential topics they may discuss if they meet.
Question:
What is the most frequency word the communism philosopher and
capitalism philosophers use in sentences ?
What is the characteristic of Communism philosophers and
capitalism philosophers ?
What are the possible topics that Communism philosophers and
Capitalism philosophers will tend to talk about ?
library(magrittr) # needs to be run every time you start R and want to use %>%
library(dplyr) # alternatively, this also loads %>%
library(tidyverse)
library(tidytext)
library(ggplot2)
library(dplyr)
library(tidyr)
library(wordcloud)
library(tm)
library(topicmodels)
library(RColorBrewer)
d=read.csv("../data/philosophy_data.csv")
capitalism = subset(d, school == "capitalism")
communism =subset(d, school=="communism")
Q1. What is the most frequency word the communism philosopher and
capitalism philosophers use in sentences ?
tidy_communism <- communism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words) %>%
count(word)%>%
filter(n >500)%>%
arrange(desc(n))
Joining, by = "word"
#write.csv(tidy_communism, "../output/com_word_freq.csv", row.names=FALSE)
tidy_communism
hist(tidy_communism$n)

First, I try to clear out two word frequency csv files, in order to
do the frequency analysis.Then,according to the word frequency,
communism have unbelievable emphasize on labor.Communism is a political
and economic ideology that emphasizes the collective ownership of the
means of production and the elimination of social classes. This is often
achieved through the centralization of labor power and the distribution
of wealth and resources based on the principle of “from each according
to their ability, to each according to their need.” The goal of
communism is to improve the living standards of ordinary workers and
create a more equitable society.
tidy_capitalism <- capitalism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words) %>%
count(word)%>%
filter(n >500)%>%
arrange(desc(n))
Joining, by = "word"
# write.csv(tidy_capitalism, "../output/cap_word_freq.csv", row.names=FALSE)
tidy_capitalism
hist(tidy_capitalism$n)

The most commonly used words in discussions about communism are
“price”, “money” and “labor” that focus on the ordinary workers. The top
10 words chosen by people discussing capitalism may vary, but they are
likely to focus on business-related concepts which is based on private
ownership of the means of production and the creation of goods and
services for profit
The following two work clouds can show different concerns that two
ideologies. We can understand although there are two total different
ideologies in the society. They still have relative high similar words.
The most common words for communism are labor and capital. On the other
hand, capitalism philosophers tend to use the word like price and money
which answer the first question. This may indicate that despite the
fundamental differences, both ideologies share some common concerns,
such as economy, society, and government. Additionally, it’s also
important to note that language used to discuss these ideologies may be
similar, but the context and perspective can change the meaning of the
words.
wordcloud(words =tidy_communism$word, freq=tidy_communism$n, max.words =100,
colors=brewer.pal(8, "Dark2"))

wordcloud(words =tidy_capitalism$word, freq=tidy_capitalism$n, max.words =100,
colors=brewer.pal(8, "Dark2"))

all_capitalism <- capitalism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words) %>%
count(word)%>%
arrange(desc(n))
Joining, by = "word"
all_communism <- communism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words) %>%
count(word)%>%
arrange(desc(n))
Joining, by = "word"
Q2. What is the characteristic of communism philosophers and
capitalism philosophers ?
library("textdata")
sentiments_capitalism= all_capitalism %>%
inner_join(get_sentiments("nrc")) %>%
filter(sentiment %in% c("anticipation", "joy", "surprise", "trust",
"anger", "disgust", "fear", "sadness" ))
Joining, by = "word"
new2=sentiments_capitalism %>%
count(sentiment) %>%
# Arrange the sentiment counts in descending order
arrange(desc(n))
sentiments_capitalism %>%
group_by(sentiment) %>%
top_n(5, n) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word,n, fill=sentiment, label=n )) +
geom_bar(stat="identity") +
coord_flip()

sentiments_capitalism %>%
group_by(sentiment) %>%
top_n(5, n) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
# Set up the plot with aes()
ggplot(aes(word,n, fill=sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ sentiment, scales = "free") +
coord_flip()

col.use=c("darkgoldenrod1", "darkgoldenrod2", "darkgoldenrod3", "darkgoldenrod4",
"red2", "chartreuse3", "blueviolet","dodgerblue3")
barplot(new2$n, las=2, horiz=T, col=col.use[order(new2$n)], names.arg=new2$sentiment, main="capitalism philosophers")

sentiments_capitalism %>%
count(sentiment) %>%
# Arrange the sentiment counts in descending order
arrange(desc(n))
sentiments_communism= all_communism %>%
inner_join(get_sentiments("nrc")) %>%
filter(sentiment %in% c("anticipation", "joy", "surprise", "trust",
"anger", "disgust", "fear", "sadness" ))
Joining, by = "word"
new1 = sentiments_communism %>%
count(sentiment) %>%
# Arrange the sentiment counts in descending order
arrange(desc(n))
new1
sentiments_communism %>%
group_by(sentiment) %>%
# Take the top 10 words for each sentiment
top_n(5, n) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
ggplot(aes(word,n, fill=sentiment, label=n )) +
geom_bar(stat="identity") +
coord_flip()

sentiments_communism %>%
group_by(sentiment) %>%
# Take the top 10 words for each sentiment
top_n(5, n) %>%
ungroup() %>%
mutate(word = reorder(word, n)) %>%
# Set up the plot with aes()
ggplot(aes(word,n, fill=sentiment)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ sentiment, scales = "free") +
coord_flip()

col.use=c("darkgoldenrod1", "darkgoldenrod2", "darkgoldenrod3", "darkgoldenrod4",
"red2", "chartreuse3", "blueviolet","dodgerblue3")
barplot(new1$n, las=2, horiz=T, col=col.use[order(new1$n)], names.arg=new1$sentiment, main="communism philosophers")

After doing the word frequency perspective, I want to do the
emotional analysis to investigate their characteristic. IN general,
capitalism philosophers in general have less surprise, less trust, less
disgust in their sentences. The similarity are their opinion towards
happy and sadness. The mainly differences are the perspective of
disgust. Communism philosophers have anger on slavery and death. In
comparison, capitalism philosophers tend to have anger on abundance or
prohibited the words that shows low profit. Also, capitalism philosopher
have less trust and less surprise toward the public. These
characteristic reflect their personalities are more calm and peace.
Q3. What are the possible topics that Communism philosophers and
Capitalism philosophers will tend to talk about ?
library("reshape2")
communism = subset(d, author == "Marx")
capitalism =subset(d, author=="Smith")
tidy_communism <- communism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words)
Joining, by = "word"
dtm_communism = tidy_communism %>%
count(word, author) %>%
# Cast the word counts into a DTM
cast_dtm(author, word, n)
tidy_capitalism <- capitalism %>%
unnest_tokens(word, sentence_str) %>%
anti_join(stop_words)
Joining, by = "word"
dtm_capitalism = tidy_capitalism%>%
count(word, author) %>%
# Cast the word counts into a DTM
cast_dtm(author, word, n)
#Number of topics
k <- 5
#Run LDA using Gibbs sampling
ldaOut <-LDA(dtm_capitalism, k, method="Gibbs")
#write out results
#docs to topics
ldaOut.topics <- as.matrix(topics(ldaOut))
table(c(1:k, ldaOut.topics))
1 2 3 4 5
1 2 1 1 1
ldaOut.topics
[,1]
Smith 2
terms.beta=ldaOut@beta
terms.beta=scale(terms.beta)
topics.terms=NULL
for(i in 1:k){
topics.terms=rbind(topics.terms, ldaOut@terms[order(terms.beta[i,], decreasing = TRUE)[1:5]])
}
topics.terms
[,1] [,2] [,3] [,4] [,5]
[1,] "dress" "personal" "weekly" "lectures" "frivolous"
[2,] "labour" "quantity" "money" "silver" "time"
[3,] "machinery" "cash" "prejudices" "savings" "begins"
[4,] "earth" "foreigners" "channel" "moderation" "pains"
[5,] "bought" "stand" "constancy" "careless" "italian"

k <- 5
#Run LDA using Gibbs sampling
ldaOut <-LDA(dtm_communism, k, method="Gibbs")
terms.beta=ldaOut@beta
terms.beta=scale(terms.beta)
topics.terms=NULL
for(i in 1:k){
topics.terms=rbind(topics.terms, ldaOut@terms[order(terms.beta[i,], decreasing = TRUE)[1:5]])
}
topics.terms
[,1] [,2] [,3] [,4] [,5]
[1,] "frequently" "military" "rose" "potter" "grow"
[2,] "o'clock" "robbery" "mention" "assertion" "tautology"
[3,] "yields" "explained" "wonderful" "remedy" "sink"
[4,] "save" "valeur" "hunger" "pol" "variations"
[5,] "money" "form" "commodities" "surplus" "commodity"

According to the LDA analysis that learn in the class, the
representation of Communism philosopher Marx will tend to say about why
the workers don’t have enough payment all the time. The workers are
always hungry and poor. Then, the representation of Capitalism
philosophers, Smith will argue that we need to build the country. There
are overwhelming demanding that the labor need to do. Also, He believed
that the labor market, when left to its own devices, will adjust itself
to balance supply and demand.
Question:
What is the most frequency word the communism philosopher and
capitalism philosophers use in sentences ?
What is the characteristic of Communism philosophers and
capitalism philosophers ?
What are the possible topics that Communism philosophers and
Capitalism philosophers will tend to talk about ?
Conclusions
The most common used words for communism philosopher are “labor”,
“capital”, and production. Also, the most frequency words that
capitalism philosopher used are “price”, “money”, and “labor”
The characteristic of capitalism philosophers are innovative,
leading to greater efficiency, and calm. In comparison, communism
philosophers tend to have anger on abundance or prohibited the words
that shows low profit.
Marx may asked Smith to focus on labor life quality. Then, Smith
will argue that efficiency on production and principle of a free market
is the core topic. They may argue about society and the public in the
following topics.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKClBoaWxvc29waHkgRGF0YSBTdG9yeSBMaWFuZyBIdSAwMS8yMy8yMDIyCgojIyMgd2hlbiBjb21tdW5pc20gcGhpbG9zb3BoZXJzIG1lZXQgY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMKCgoKIyMjIEludHJvZHVjdGlvbjoKQ29tbXVuaXNtIGFuZCBjYXBpdGFsaXNtIGFyZSB0d28gZGlmZmVyZW50IGVjb25vbWljIGFuZCBwb2xpdGljYWwgaWRlb2xvZ2llcyB0aGF0IGhhdmUgaGFkIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBkZXZlbG9wbWVudCBvZiBtb2Rlcm4gc29jaWV0eS4KQm90aCBpZGVvbG9naWVzIGhhdmUgdGhlaXIgcm9vdHMgaW4gcGhpbG9zb3BoeSwgYW5kIHRoZXkgaGF2ZSBiZWVuIHRoZSBzdWJqZWN0IG9mIG11Y2ggZGViYXRlIGFuZCBkaXNjdXNzaW9uIHRocm91Z2hvdXQgaGlzdG9yeS4KCkNvbW11bmlzbSwgYXMgYSBwb2xpdGljYWwgYW5kIGVjb25vbWljIHN5c3RlbSwgaXMgYmFzZWQgb24gdGhlIGlkZWEgdGhhdCBhbGwgaW5kaXZpZHVhbHMgc2hvdWxkIGhhdmUgZXF1YWwgYWNjZXNzIHRvIHRoZSBtZWFucyBvZiBwcm9kdWN0aW9uLCBhbmQgdGhhdCB0aGUgc3RhdGUgc2hvdWxkIGNvbnRyb2wgYW5kIG93biB0aGVzZSBtZWFucy4KVGhpcyBzeXN0ZW0gaXMgaW50ZW5kZWQgdG8gZWxpbWluYXRlIGNsYXNzIGRpc3RpbmN0aW9ucyBhbmQgY3JlYXRlIGEgc29jaWV0eSB3aGVyZSBldmVyeW9uZSBoYXMgZXF1YWwgb3Bwb3J0dW5pdHkgYW5kIGFjY2VzcyB0byByZXNvdXJjZXMuClRoZSBwaGlsb3NvcGhlciBLYXJsIE1hcnggaXMgY29uc2lkZXJlZCB0aGUgZmF0aGVyIG9mIGNvbW11bmlzbSwgYW5kIGhpcyBpZGVhcyBoYXZlIGJlZW4gaW5mbHVlbnRpYWwgaW4gdGhlIGRldmVsb3BtZW50IG9mIGNvbW11bmlzdCBzb2NpZXRpZXMgdGhyb3VnaG91dCB0aGUgd29ybGQuCgpDYXBpdGFsaXNtLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgYW4gZWNvbm9taWMgc3lzdGVtIGluIHdoaWNoIHByaXZhdGUgaW5kaXZpZHVhbHMgYW5kIGJ1c2luZXNzZXMgb3duIHRoZSBtZWFucyBvZiBwcm9kdWN0aW9uLCBhbmQgdGhlIGVjb25vbXkgaXMgZHJpdmVuIGJ5IHRoZSBwcm9maXQgbW90aXZlLgpUaGUgc3RhdGUgcGxheXMgYSBsaW1pdGVkIHJvbGUgaW4gdGhlIGVjb25vbXksIGFuZCBpbmRpdmlkdWFscyBhcmUgZnJlZSB0byBvd24gcHJvcGVydHksIHN0YXJ0IGJ1c2luZXNzZXMsIGFuZCBjb21wZXRlIGluIHRoZSBtYXJrZXQuClRoZSBwaGlsb3NvcGhlciBBZGFtIFNtaXRoIGlzIGNvbnNpZGVyZWQgdGhlIGZhdGhlciBvZiBjYXBpdGFsaXNtLCBhbmQgaGlzIGlkZWFzIGFib3V0IGxhaXNzZXotZmFpcmUgZWNvbm9taWNzIGhhdmUgYmVlbiBpbmZsdWVudGlhbCBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgY2FwaXRhbGlzdCBzb2NpZXRpZXMgdGhyb3VnaG91dCB0aGUgd29ybGQuCgpUaGlzIHJlcG9ydCBpcyBhIGd1aWRlYm9vayB3aXRoIHNlbGVjdGVkIFEmQSBhaW1zIGF0IGZpbmRpbmcgb3V0IHRoZSBwZXJzb25hbGl0eSBvZiByZXByZXNlbnRhdGl2ZSBjYXBpdGFsaXNtIHBoaWxvc29waGVyIGFuZCByZXByZXNlbnRhdGl2ZSBjb21tdW5pc20gcGhpbG9zb3BoZXJzLiBBbHNvLCBpbnZlc3RpZ2F0aW5nIHdoYXQgYXJlIHRoZSBwb3RlbnRpYWwgdG9waWNzIHRoZXkgbWF5IGRpc2N1c3MgaWYgdGhleSBtZWV0LgoKIyMjIFF1ZXN0aW9uOgoKMS4gIFdoYXQgaXMgdGhlIG1vc3QgZnJlcXVlbmN5IHdvcmQgdGhlIGNvbW11bmlzbSBwaGlsb3NvcGhlciBhbmQgY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMgdXNlIGluIHNlbnRlbmNlcyA/CgoyLiAgV2hhdCBpcyB0aGUgY2hhcmFjdGVyaXN0aWMgb2YgQ29tbXVuaXNtIHBoaWxvc29waGVycyBhbmQgY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMgPwoKMy4gIFdoYXQgYXJlIHRoZSBwb3NzaWJsZSB0b3BpY3MgdGhhdCBDb21tdW5pc20gcGhpbG9zb3BoZXJzIGFuZCBDYXBpdGFsaXNtIHBoaWxvc29waGVycyB3aWxsIHRlbmQgdG8gdGFsayBhYm91dCA/CgpgYGB7cn0KbGlicmFyeShtYWdyaXR0cikgIyBuZWVkcyB0byBiZSBydW4gZXZlcnkgdGltZSB5b3Ugc3RhcnQgUiBhbmQgd2FudCB0byB1c2UgJT4lCmxpYnJhcnkoZHBseXIpICAgICMgYWx0ZXJuYXRpdmVseSwgdGhpcyBhbHNvIGxvYWRzICU+JQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeSh0bSkKbGlicmFyeSh0b3BpY21vZGVscykKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmBgYAoKYGBge3J9CmQ9cmVhZC5jc3YoIi4uL2RhdGEvcGhpbG9zb3BoeV9kYXRhLmNzdiIpCmBgYAoKYGBge3J9CmNhcGl0YWxpc20gPSBzdWJzZXQoZCwgc2Nob29sID09ICJjYXBpdGFsaXNtIikKY29tbXVuaXNtID1zdWJzZXQoZCwgc2Nob29sPT0iY29tbXVuaXNtIikKYGBgCgojIyMgUTEuIFdoYXQgaXMgdGhlIG1vc3QgZnJlcXVlbmN5IHdvcmQgdGhlIGNvbW11bmlzbSBwaGlsb3NvcGhlciBhbmQgY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMgdXNlIGluIHNlbnRlbmNlcyA/CgpgYGB7cn0KdGlkeV9jb21tdW5pc20gPC0gY29tbXVuaXNtICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0cikgJT4lCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQogIGNvdW50KHdvcmQpJT4lIAogIGZpbHRlcihuID41MDApJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKI3dyaXRlLmNzdih0aWR5X2NvbW11bmlzbSwgIi4uL291dHB1dC9jb21fd29yZF9mcmVxLmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkKdGlkeV9jb21tdW5pc20KYGBgCgpgYGB7cn0KaGlzdCh0aWR5X2NvbW11bmlzbSRuKQpgYGAKCiAgRmlyc3QsIEkgdHJ5IHRvIGNsZWFyIG91dCB0d28gd29yZCBmcmVxdWVuY3kgY3N2IGZpbGVzLCBpbiBvcmRlciB0byBkbyB0aGUgZnJlcXVlbmN5IGFuYWx5c2lzLlRoZW4sYWNjb3JkaW5nIHRvIHRoZSB3b3JkIGZyZXF1ZW5jeSwgY29tbXVuaXNtIGhhdmUgdW5iZWxpZXZhYmxlIGVtcGhhc2l6ZSBvbiBsYWJvci5Db21tdW5pc20gaXMgYSBwb2xpdGljYWwgYW5kIGVjb25vbWljIGlkZW9sb2d5IHRoYXQgZW1waGFzaXplcyB0aGUgY29sbGVjdGl2ZSBvd25lcnNoaXAgb2YgdGhlIG1lYW5zIG9mIHByb2R1Y3Rpb24gYW5kIHRoZSBlbGltaW5hdGlvbiBvZiBzb2NpYWwgY2xhc3Nlcy4gVGhpcyBpcyBvZnRlbiBhY2hpZXZlZCB0aHJvdWdoIHRoZSBjZW50cmFsaXphdGlvbiBvZiBsYWJvciBwb3dlciBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB3ZWFsdGggYW5kIHJlc291cmNlcyBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIG9mICJmcm9tIGVhY2ggYWNjb3JkaW5nIHRvIHRoZWlyIGFiaWxpdHksIHRvIGVhY2ggYWNjb3JkaW5nIHRvIHRoZWlyIG5lZWQuIiBUaGUgZ29hbCBvZiBjb21tdW5pc20gaXMgdG8gaW1wcm92ZSB0aGUgbGl2aW5nIHN0YW5kYXJkcyBvZiBvcmRpbmFyeSB3b3JrZXJzIGFuZCBjcmVhdGUgYSBtb3JlIGVxdWl0YWJsZSBzb2NpZXR5LgoKYGBge3J9CnRpZHlfY2FwaXRhbGlzbSA8LSBjYXBpdGFsaXNtICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0cikgJT4lCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpICU+JQogIGNvdW50KHdvcmQpJT4lIAogIGZpbHRlcihuID41MDApJT4lIAogIGFycmFuZ2UoZGVzYyhuKSkKCiMgd3JpdGUuY3N2KHRpZHlfY2FwaXRhbGlzbSwgIi4uL291dHB1dC9jYXBfd29yZF9mcmVxLmNzdiIsIHJvdy5uYW1lcz1GQUxTRSkKdGlkeV9jYXBpdGFsaXNtCmBgYAoKYGBge3J9Cmhpc3QodGlkeV9jYXBpdGFsaXNtJG4pCgpgYGAKCiAgVGhlIG1vc3QgY29tbW9ubHkgdXNlZCB3b3JkcyBpbiBkaXNjdXNzaW9ucyBhYm91dCBjb21tdW5pc20gYXJlICJwcmljZSIsICJtb25leSIgYW5kICJsYWJvciIgdGhhdCBmb2N1cyBvbiB0aGUgb3JkaW5hcnkgd29ya2Vycy4KVGhlIHRvcCAxMCB3b3JkcyBjaG9zZW4gYnkgcGVvcGxlIGRpc2N1c3NpbmcgY2FwaXRhbGlzbSBtYXkgdmFyeSwgYnV0IHRoZXkgYXJlIGxpa2VseSB0byBmb2N1cyBvbiBidXNpbmVzcy1yZWxhdGVkIGNvbmNlcHRzIHdoaWNoIGlzIGJhc2VkIG9uIHByaXZhdGUgb3duZXJzaGlwIG9mIHRoZSBtZWFucyBvZiBwcm9kdWN0aW9uIGFuZCB0aGUgY3JlYXRpb24gb2YgZ29vZHMgYW5kIHNlcnZpY2VzIGZvciBwcm9maXQKCiAgVGhlIGZvbGxvd2luZyB0d28gd29yayBjbG91ZHMgY2FuIHNob3cgZGlmZmVyZW50IGNvbmNlcm5zIHRoYXQgdHdvIGlkZW9sb2dpZXMuCldlIGNhbiB1bmRlcnN0YW5kIGFsdGhvdWdoIHRoZXJlIGFyZSB0d28gdG90YWwgZGlmZmVyZW50IGlkZW9sb2dpZXMgaW4gdGhlIHNvY2lldHkuClRoZXkgc3RpbGwgaGF2ZSByZWxhdGl2ZSBoaWdoIHNpbWlsYXIgd29yZHMuClRoZSBtb3N0IGNvbW1vbiB3b3JkcyBmb3IgY29tbXVuaXNtIGFyZSBsYWJvciBhbmQgY2FwaXRhbC4KT24gdGhlIG90aGVyIGhhbmQsIGNhcGl0YWxpc20gcGhpbG9zb3BoZXJzIHRlbmQgdG8gdXNlIHRoZSB3b3JkIGxpa2UgcHJpY2UgYW5kIG1vbmV5IHdoaWNoIGFuc3dlciB0aGUgZmlyc3QgcXVlc3Rpb24uClRoaXMgbWF5IGluZGljYXRlIHRoYXQgZGVzcGl0ZSB0aGUgZnVuZGFtZW50YWwgZGlmZmVyZW5jZXMsIGJvdGggaWRlb2xvZ2llcyBzaGFyZSBzb21lIGNvbW1vbiBjb25jZXJucywgc3VjaCBhcyBlY29ub215LCBzb2NpZXR5LCBhbmQgZ292ZXJubWVudC4KQWRkaXRpb25hbGx5LCBpdCdzIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBsYW5ndWFnZSB1c2VkIHRvIGRpc2N1c3MgdGhlc2UgaWRlb2xvZ2llcyBtYXkgYmUgc2ltaWxhciwgYnV0IHRoZSBjb250ZXh0IGFuZCBwZXJzcGVjdGl2ZSBjYW4gY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSB3b3Jkcy4KCmBgYHtyfQp3b3JkY2xvdWQod29yZHMgPXRpZHlfY29tbXVuaXNtJHdvcmQsIGZyZXE9dGlkeV9jb21tdW5pc20kbiwgbWF4LndvcmRzID0xMDAsIAogICAgICAgICAgY29sb3JzPWJyZXdlci5wYWwoOCwgIkRhcmsyIikpCgp3b3JkY2xvdWQod29yZHMgPXRpZHlfY2FwaXRhbGlzbSR3b3JkLCBmcmVxPXRpZHlfY2FwaXRhbGlzbSRuLCBtYXgud29yZHMgPTEwMCwgCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg4LCAiRGFyazIiKSkKCmBgYAoKYGBge3J9CiAgYWxsX2NhcGl0YWxpc20gPC0gY2FwaXRhbGlzbSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCBzZW50ZW5jZV9zdHIpICU+JQogIGFudGlfam9pbihzdG9wX3dvcmRzKSAlPiUKICBjb3VudCh3b3JkKSU+JSAKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKYGBge3J9CiAgYWxsX2NvbW11bmlzbSA8LSBjb21tdW5pc20gJT4lIAogIHVubmVzdF90b2tlbnMod29yZCwgc2VudGVuY2Vfc3RyKSAlPiUKICBhbnRpX2pvaW4oc3RvcF93b3JkcykgJT4lCiAgY291bnQod29yZCklPiUgCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCiMjIyBRMi4gV2hhdCBpcyB0aGUgY2hhcmFjdGVyaXN0aWMgb2YgY29tbXVuaXNtIHBoaWxvc29waGVycyBhbmQgY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMgPwoKYGBge3J9CmxpYnJhcnkoInRleHRkYXRhIikKYGBgCgpgYGB7Un0KICBzZW50aW1lbnRzX2NhcGl0YWxpc209IGFsbF9jYXBpdGFsaXNtICU+JQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpKSAlPiUgCiAgZmlsdGVyKHNlbnRpbWVudCAlaW4lIGMoImFudGljaXBhdGlvbiIsICJqb3kiLCAic3VycHJpc2UiLCAidHJ1c3QiLAogICAgICAgICAgICAgICAgICJhbmdlciIsICJkaXNndXN0IiwgImZlYXIiLCAic2FkbmVzcyIgKSkKYGBgCgpgYGB7cn0KCm5ldzI9c2VudGltZW50c19jYXBpdGFsaXNtICU+JSAKICBjb3VudChzZW50aW1lbnQpICU+JSAKICAjIEFycmFuZ2UgdGhlIHNlbnRpbWVudCBjb3VudHMgaW4gZGVzY2VuZGluZyBvcmRlcgogIGFycmFuZ2UoZGVzYyhuKSkKCmBgYAoKYGBge3J9CnNlbnRpbWVudHNfY2FwaXRhbGlzbSAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogIHRvcF9uKDUsIG4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIGdncGxvdChhZXMod29yZCxuLCBmaWxsPXNlbnRpbWVudCwgbGFiZWw9biApKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIGNvb3JkX2ZsaXAoKQpgYGAKCmBgYHtyfQpzZW50aW1lbnRzX2NhcGl0YWxpc20gJT4lCiAgZ3JvdXBfYnkoc2VudGltZW50KSAlPiUKICB0b3Bfbig1LCBuKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIG4pKSAlPiUKICAjIFNldCB1cCB0aGUgcGxvdCB3aXRoIGFlcygpCiAgZ2dwbG90KGFlcyh3b3JkLG4sIGZpbGw9c2VudGltZW50KSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH4gc2VudGltZW50LCBzY2FsZXMgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgpgYGB7cn0KY29sLnVzZT1jKCJkYXJrZ29sZGVucm9kMSIsICJkYXJrZ29sZGVucm9kMiIsICJkYXJrZ29sZGVucm9kMyIsICJkYXJrZ29sZGVucm9kNCIsCiAgICAgICAgICAgICJyZWQyIiwgImNoYXJ0cmV1c2UzIiwgImJsdWV2aW9sZXQiLCJkb2RnZXJibHVlMyIpCmJhcnBsb3QobmV3MiRuLCBsYXM9MiwgaG9yaXo9VCwgY29sPWNvbC51c2Vbb3JkZXIobmV3MiRuKV0sIG5hbWVzLmFyZz1uZXcyJHNlbnRpbWVudCwgbWFpbj0iY2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMiKQpgYGAKCmBgYHtSfQpzZW50aW1lbnRzX2NhcGl0YWxpc20gJT4lIAogIGNvdW50KHNlbnRpbWVudCkgJT4lIAogICMgQXJyYW5nZSB0aGUgc2VudGltZW50IGNvdW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyCiAgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtSfQogIHNlbnRpbWVudHNfY29tbXVuaXNtPSBhbGxfY29tbXVuaXNtICU+JQogIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpKSAlPiUgCiAgZmlsdGVyKHNlbnRpbWVudCAlaW4lIGMoImFudGljaXBhdGlvbiIsICJqb3kiLCAic3VycHJpc2UiLCAidHJ1c3QiLAogICAgICAgICAgICAgICAgICJhbmdlciIsICJkaXNndXN0IiwgImZlYXIiLCAic2FkbmVzcyIgKSkKYGBgCgpgYGB7Un0KbmV3MSA9IHNlbnRpbWVudHNfY29tbXVuaXNtICU+JSAKICBjb3VudChzZW50aW1lbnQpICU+JSAKICAjIEFycmFuZ2UgdGhlIHNlbnRpbWVudCBjb3VudHMgaW4gZGVzY2VuZGluZyBvcmRlcgogIGFycmFuZ2UoZGVzYyhuKSkKbmV3MQpgYGAKCmBgYHtyfQpzZW50aW1lbnRzX2NvbW11bmlzbSAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogICMgVGFrZSB0aGUgdG9wIDEwIHdvcmRzIGZvciBlYWNoIHNlbnRpbWVudAogIHRvcF9uKDUsIG4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIGdncGxvdChhZXMod29yZCxuLCBmaWxsPXNlbnRpbWVudCwgbGFiZWw9biApKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIGNvb3JkX2ZsaXAoKQpgYGAKCmBgYHtyfQpzZW50aW1lbnRzX2NvbW11bmlzbSAlPiUKICBncm91cF9ieShzZW50aW1lbnQpICU+JQogIHRvcF9uKDUsIG4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCwgbikpICU+JQogIGdncGxvdChhZXMod29yZCxuLCBmaWxsPXNlbnRpbWVudCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IHNlbnRpbWVudCwgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKYGBge3J9CmNvbC51c2U9YygiZGFya2dvbGRlbnJvZDEiLCAiZGFya2dvbGRlbnJvZDIiLCAiZGFya2dvbGRlbnJvZDMiLCAiZGFya2dvbGRlbnJvZDQiLAogICAgICAgICAgICAicmVkMiIsICJjaGFydHJldXNlMyIsICJibHVldmlvbGV0IiwiZG9kZ2VyYmx1ZTMiKQpiYXJwbG90KG5ldzEkbiwgbGFzPTIsIGhvcml6PVQsIGNvbD1jb2wudXNlW29yZGVyKG5ldzEkbildLCBuYW1lcy5hcmc9bmV3MSRzZW50aW1lbnQsIG1haW49ImNvbW11bmlzbSBwaGlsb3NvcGhlcnMiKQpgYGAKCiAgQWZ0ZXIgZG9pbmcgdGhlIHdvcmQgZnJlcXVlbmN5IHBlcnNwZWN0aXZlLCBJIHdhbnQgdG8gZG8gdGhlIGVtb3Rpb25hbCBhbmFseXNpcyB0byBpbnZlc3RpZ2F0ZSB0aGVpciBjaGFyYWN0ZXJpc3RpYy4gIElOIGdlbmVyYWwsIGNhcGl0YWxpc20gcGhpbG9zb3BoZXJzIGluIGdlbmVyYWwgaGF2ZSBsZXNzIHN1cnByaXNlLCBsZXNzIHRydXN0LCBsZXNzIGRpc2d1c3QgaW4gdGhlaXIgc2VudGVuY2VzLgpUaGUgc2ltaWxhcml0eSBhcmUgdGhlaXIgb3BpbmlvbiB0b3dhcmRzIGhhcHB5IGFuZCBzYWRuZXNzLiBUaGUgbWFpbmx5IGRpZmZlcmVuY2VzIGFyZSB0aGUgcGVyc3BlY3RpdmUgb2YgZGlzZ3VzdC4KQ29tbXVuaXNtIHBoaWxvc29waGVycyBoYXZlIGFuZ2VyIG9uIHNsYXZlcnkgYW5kIGRlYXRoLgogIEluIGNvbXBhcmlzb24sIGNhcGl0YWxpc20gcGhpbG9zb3BoZXJzIHRlbmQgdG8gaGF2ZSBhbmdlciBvbiBhYnVuZGFuY2Ugb3IgcHJvaGliaXRlZCB0aGUgd29yZHMgdGhhdCBzaG93cyBsb3cgcHJvZml0LgpBbHNvLCBjYXBpdGFsaXNtIHBoaWxvc29waGVyIGhhdmUgbGVzcyB0cnVzdCBhbmQgbGVzcyBzdXJwcmlzZSB0b3dhcmQgdGhlIHB1YmxpYy4KVGhlc2UgY2hhcmFjdGVyaXN0aWMgcmVmbGVjdCB0aGVpciBwZXJzb25hbGl0aWVzIGFyZSBtb3JlIGNhbG0gYW5kIHBlYWNlLgoKIyMjIFEzLiBXaGF0IGFyZSB0aGUgcG9zc2libGUgdG9waWNzIHRoYXQgQ29tbXVuaXNtIHBoaWxvc29waGVycyBhbmQgQ2FwaXRhbGlzbSBwaGlsb3NvcGhlcnMgd2lsbCB0ZW5kIHRvIHRhbGsgYWJvdXQgPwoKYGBge3J9CmxpYnJhcnkoInJlc2hhcGUyIikKYGBgCgpgYGB7cn0KY29tbXVuaXNtID0gc3Vic2V0KGQsIGF1dGhvciA9PSAiTWFyeCIpCmNhcGl0YWxpc20gPXN1YnNldChkLCBhdXRob3I9PSJTbWl0aCIpCmBgYAoKYGBge3J9CiAgdGlkeV9jb21tdW5pc20gPC0gY29tbXVuaXNtICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0cikgJT4lCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIApkdG1fY29tbXVuaXNtID0gdGlkeV9jb21tdW5pc20gJT4lCiAgY291bnQod29yZCwgYXV0aG9yKSAlPiUgCiAgIyBDYXN0IHRoZSB3b3JkIGNvdW50cyBpbnRvIGEgRFRNCiAgY2FzdF9kdG0oYXV0aG9yLCB3b3JkLCBuKQpgYGAKCmBgYHtyfQogIHRpZHlfY2FwaXRhbGlzbSA8LSBjYXBpdGFsaXNtICU+JSAKICB1bm5lc3RfdG9rZW5zKHdvcmQsIHNlbnRlbmNlX3N0cikgJT4lCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIApkdG1fY2FwaXRhbGlzbSA9IHRpZHlfY2FwaXRhbGlzbSU+JQogIGNvdW50KHdvcmQsIGF1dGhvcikgJT4lIAogICMgQ2FzdCB0aGUgd29yZCBjb3VudHMgaW50byBhIERUTQogIGNhc3RfZHRtKGF1dGhvciwgd29yZCwgbikKYGBgCgpgYGB7cn0KCiNOdW1iZXIgb2YgdG9waWNzCmsgPC0gNQojUnVuIExEQSB1c2luZyBHaWJicyBzYW1wbGluZwpsZGFPdXQgPC1MREEoZHRtX2NhcGl0YWxpc20sIGssIG1ldGhvZD0iR2liYnMiKQojd3JpdGUgb3V0IHJlc3VsdHMKI2RvY3MgdG8gdG9waWNzCmxkYU91dC50b3BpY3MgPC0gYXMubWF0cml4KHRvcGljcyhsZGFPdXQpKQp0YWJsZShjKDE6aywgbGRhT3V0LnRvcGljcykpCmxkYU91dC50b3BpY3MKYGBgCgpgYGB7cn0KdGVybXMuYmV0YT1sZGFPdXRAYmV0YQp0ZXJtcy5iZXRhPXNjYWxlKHRlcm1zLmJldGEpCnRvcGljcy50ZXJtcz1OVUxMCmZvcihpIGluIDE6ayl7CiAgdG9waWNzLnRlcm1zPXJiaW5kKHRvcGljcy50ZXJtcywgbGRhT3V0QHRlcm1zW29yZGVyKHRlcm1zLmJldGFbaSxdLCBkZWNyZWFzaW5nID0gVFJVRSlbMTo1XV0pCn0KdG9waWNzLnRlcm1zCmBgYAoKIVtdKC4uL2ZpZ3Mvc21pdGgucG5nKQoKYGBge3J9CmsgPC0gNQojUnVuIExEQSB1c2luZyBHaWJicyBzYW1wbGluZwpsZGFPdXQgPC1MREEoZHRtX2NvbW11bmlzbSwgaywgbWV0aG9kPSJHaWJicyIpCiN3cml0ZSBvdXQgcmVzdWx0cwojZG9jcyB0byB0b3BpY3MKbGRhT3V0LnRvcGljcyA8LSBhcy5tYXRyaXgodG9waWNzKGxkYU91dCkpCnRhYmxlKGMoMTprLCBsZGFPdXQudG9waWNzKSkKbGRhT3V0LnRvcGljcwpgYGAKCmBgYHtyfQp0ZXJtcy5iZXRhPWxkYU91dEBiZXRhCnRlcm1zLmJldGE9c2NhbGUodGVybXMuYmV0YSkKdG9waWNzLnRlcm1zPU5VTEwKZm9yKGkgaW4gMTprKXsKICB0b3BpY3MudGVybXM9cmJpbmQodG9waWNzLnRlcm1zLCBsZGFPdXRAdGVybXNbb3JkZXIodGVybXMuYmV0YVtpLF0sIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjVdXSkKfQp0b3BpY3MudGVybXMKYGBgCgohW10oLi4vZmlncy9tYXJ4LnBuZykKCiAKIAogCiAgQWNjb3JkaW5nIHRvIHRoZSBMREEgYW5hbHlzaXMgdGhhdCBsZWFybiBpbiB0aGUgY2xhc3MsIHRoZSByZXByZXNlbnRhdGlvbiBvZiBDb21tdW5pc20gcGhpbG9zb3BoZXIgTWFyeCB3aWxsIHRlbmQgdG8gc2F5IGFib3V0IHdoeSB0aGUgd29ya2VycyBkb24ndCBoYXZlIGVub3VnaCBwYXltZW50IGFsbCB0aGUgdGltZS4gVGhlIHdvcmtlcnMgYXJlIGFsd2F5cyBodW5ncnkgYW5kIHBvb3IuClRoZW4sIHRoZSByZXByZXNlbnRhdGlvbiBvZiBDYXBpdGFsaXNtIHBoaWxvc29waGVycywgU21pdGggd2lsbCBhcmd1ZSB0aGF0IHdlIG5lZWQgdG8gYnVpbGQgdGhlIGNvdW50cnkuClRoZXJlIGFyZSBvdmVyd2hlbG1pbmcgZGVtYW5kaW5nIHRoYXQgdGhlIGxhYm9yIG5lZWQgdG8gZG8uCkFsc28sIEhlIGJlbGlldmVkIHRoYXQgdGhlIGxhYm9yIG1hcmtldCwgd2hlbiBsZWZ0IHRvIGl0cyBvd24gZGV2aWNlcywgd2lsbCBhZGp1c3QgaXRzZWxmIHRvIGJhbGFuY2Ugc3VwcGx5IGFuZCBkZW1hbmQuCgojIyMgUXVlc3Rpb246CgoxLiAgV2hhdCBpcyB0aGUgbW9zdCBmcmVxdWVuY3kgd29yZCB0aGUgY29tbXVuaXNtIHBoaWxvc29waGVyIGFuZCBjYXBpdGFsaXNtIHBoaWxvc29waGVycyB1c2UgaW4gc2VudGVuY2VzID8KCjIuICBXaGF0IGlzIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZiBDb21tdW5pc20gcGhpbG9zb3BoZXJzIGFuZCBjYXBpdGFsaXNtIHBoaWxvc29waGVycyA/CgozLiAgV2hhdCBhcmUgdGhlIHBvc3NpYmxlIHRvcGljcyB0aGF0IENvbW11bmlzbSBwaGlsb3NvcGhlcnMgYW5kIENhcGl0YWxpc20gcGhpbG9zb3BoZXJzIHdpbGwgdGVuZCB0byB0YWxrIGFib3V0ID8KCiMjIyBDb25jbHVzaW9ucwoKMS4gIFRoZSBtb3N0IGNvbW1vbiB1c2VkIHdvcmRzIGZvciBjb21tdW5pc20gcGhpbG9zb3BoZXIgYXJlICJsYWJvciIsICJjYXBpdGFsIiwgYW5kIHByb2R1Y3Rpb24uCiAgICBBbHNvLCB0aGUgbW9zdCBmcmVxdWVuY3kgd29yZHMgdGhhdCBjYXBpdGFsaXNtIHBoaWxvc29waGVyIHVzZWQgYXJlICJwcmljZSIsICJtb25leSIsIGFuZCAibGFib3IiCgoyLiAgVGhlIGNoYXJhY3RlcmlzdGljIG9mIGNhcGl0YWxpc20gcGhpbG9zb3BoZXJzIGFyZSBpbm5vdmF0aXZlLCBsZWFkaW5nIHRvIGdyZWF0ZXIgZWZmaWNpZW5jeSwgYW5kIGNhbG0uCiAgICBJbiBjb21wYXJpc29uLCBjb21tdW5pc20gcGhpbG9zb3BoZXJzIHRlbmQgdG8gaGF2ZSBhbmdlciBvbiBhYnVuZGFuY2Ugb3IgcHJvaGliaXRlZCB0aGUgd29yZHMgdGhhdCBzaG93cyBsb3cgcHJvZml0LgoKMy4gIE1hcnggbWF5IGFza2VkIFNtaXRoIHRvIGZvY3VzIG9uIGxhYm9yIGxpZmUgcXVhbGl0eS4KICAgIFRoZW4sIFNtaXRoIHdpbGwgYXJndWUgdGhhdCBlZmZpY2llbmN5IG9uIHByb2R1Y3Rpb24gYW5kIHByaW5jaXBsZSBvZiBhIGZyZWUgbWFya2V0IGlzIHRoZSBjb3JlIHRvcGljLgogICAgVGhleSBtYXkgYXJndWUgYWJvdXQgc29jaWV0eSBhbmQgdGhlIHB1YmxpYyBpbiB0aGUgZm9sbG93aW5nIHRvcGljcy4K